package middleware

import (
	"doctor_api_backend/config"
	"doctor_api_backend/utils"
	"fmt"
	"log"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

// AuthMiddleware JWT认证中间件
// 功能：
// 1. 从cookie或请求头获取token
// 2. 验证token有效性
// 3. 解析用户信息
// 4. 将用户信息存储到上下文中
// 使用方式：
//
//	router.Use(middleware.AuthMiddleware())
//
// 注意事项：
// 1. 需要在路由配置中正确使用
// 2. 确保JWT配置正确
// 3. 需要处理token过期情况
func AuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		log.Printf("正在处理请求: %s %s", c.Request.Method, c.Request.URL.Path)

		// 首先尝试从 cookie 中获取 token
		token, err := c.Cookie("token")
		if err != nil {
			log.Printf("Cookie中未找到token: %v", err)
			// 如果 cookie 中没有，则尝试从 Authorization header 中获取
			authHeader := c.GetHeader("Authorization")
			if authHeader == "" {
				log.Printf("请求头中未找到Authorization")
				c.JSON(http.StatusUnauthorized, gin.H{
					"error":  "未登录或登录已失效",
					"reason": "请求中未包含有效的认证信息",
					"tips":   fmt.Sprintf("请访问 %s/login 接口进行登录，登录成功后将获取到的token添加到请求头中：'Authorization: Bearer your-token'", config.GetAPIPath("")),
				})
				c.Abort()
				return
			}

			// 检查 Authorization header 格式
			parts := strings.SplitN(authHeader, " ", 2)
			if !(len(parts) == 2 && parts[0] == "Bearer") {
				log.Printf("Authorization header格式错误: %s", authHeader)
				c.JSON(http.StatusUnauthorized, gin.H{
					"error":  "认证格式错误",
					"reason": "Authorization请求头格式不正确，缺少Bearer前缀",
					"tips":   "请在请求头中使用正确的格式：'Authorization: Bearer your-token'",
				})
				c.Abort()
				return
			}
			token = parts[1]
		}

		// todo: 这个自动获取token的功能需要去除
		log.Printf("获取到token: %s", token)

		// 解析token
		claims, err := utils.ParseToken(token)
		if err != nil {
			log.Printf("Token解析失败: %v", err)
			c.JSON(http.StatusUnauthorized, gin.H{
				"error":  "登录已过期",
				"reason": "当前token已失效或超过有效期",
				"tips":   fmt.Sprintf("请访问 %s/login 接口重新登录获取新的token", config.GetAPIPath("")),
			})
			c.Abort()
			return
		}

		log.Printf("Token验证成功，用户ID: %d", claims.UserID)

		// 将用户信息存储到上下文中
		c.Set("userID", claims.UserID)
		c.Next()
	}
}

// 调试指南：
// 1. 中间件测试：
//    curl -X GET http://localhost:8080/api/v1/protected \
//         -H "Authorization: Bearer your-token-here"
//
// 2. 常见问题排查：
//    - Token格式错误：确保请求头格式为 "Authorization: Bearer <token>"
//    - Token过期：检查token的有效期设置
//    - Token无效：验证token签名和密钥是否正确
//    - 用户不存在：检查数据库中的用户记录
//
// 3. 开发建议：
//    - 在开发环境中可以使用 Postman 等工具测试接口
//    - 使用日志记录中间件的执行过程
//    - 考虑添加token刷新机制
//    - 可以添加角色权限验证
